/**
 * PANDA 3D SOFTWARE
 * Copyright (c) Carnegie Mellon University.  All rights reserved.
 *
 * All use of this software is subject to the terms of the revised BSD
 * license.  You should have received a copy of this license along
 * with this source code in a file named "LICENSE."
 *
 * @file nurbsBasisVector.I
 * @author drose
 * @date 2002-12-04
 */

/**
 *
 */
INLINE NurbsBasisVector::
NurbsBasisVector() {
  _order = 0;
}

/**
 *
 */
INLINE NurbsBasisVector::
~NurbsBasisVector() {
}

/**
 * Returns the order of the segments in the curve.
 */
INLINE int NurbsBasisVector::
get_order() const {
  return _order;
}

/**
 * Returns the number of piecewise continuous segments in the curve.
 */
INLINE int NurbsBasisVector::
get_num_segments() const {
  return _segments.size();
}

/**
 * Returns the first legal value of t on the curve.  Usually this is 0.0.
 */
INLINE PN_stdfloat NurbsBasisVector::
get_start_t() const {
  nassertr(!_segments.empty(), 0.0f);
  return _segments.front()._from;
}

/**
 * Returns the last legal value of t on the curve.
 */
INLINE PN_stdfloat NurbsBasisVector::
get_end_t() const {
  nassertr(!_segments.empty(), 0.0f);
  return _segments.back()._to;
}

/**
 * Returns the vertex index of the nth segment.  This is the index number of
 * the first associated control vertex within the source NurbsCurveEvaluator
 * object.
 */
INLINE int NurbsBasisVector::
get_vertex_index(int segment) const {
  nassertr(segment >= 0 && segment < (int)_segments.size(), 0);
  return _segments[segment]._vertex_index;
}

/**
 * Returns the t value of the beginning of this segment.
 */
INLINE PN_stdfloat NurbsBasisVector::
get_from(int segment) const {
  nassertr(segment >= 0 && segment < (int)_segments.size(), 0.0f);
  return _segments[segment]._from;
}

/**
 * Returns the t value of the end of this segment.
 */
INLINE PN_stdfloat NurbsBasisVector::
get_to(int segment) const {
  nassertr(segment >= 0 && segment < (int)_segments.size(), 0.0f);
  return _segments[segment]._to;
}

/**
 * Returns the basis matrix associated with the nth segment.  This is the pure
 * matrix based on the knot vector over the segment; it does not depend on the
 * control vertices.
 */
INLINE const LMatrix4 &NurbsBasisVector::
get_basis(int segment) const {
  nassertr(segment >= 0 && segment < (int)_segments.size(), LMatrix4::ident_mat());
  return _segments[segment]._basis;
}

/**
 * Scales the value of t into the range [0, 1] corresponding to [from, to].
 * Returns the scaled value.
 */
INLINE PN_stdfloat NurbsBasisVector::
scale_t(int segment, PN_stdfloat t) const {
  nassertr(segment >= 0 && segment < (int)_segments.size(), 0.0f);
  PN_stdfloat from = _segments[segment]._from;
  PN_stdfloat to = _segments[segment]._to;
  t = (t - from) / (to - from);
  return (std::min)((std::max)(t, (PN_stdfloat)0.0), (PN_stdfloat)1.0);
}
